____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
ÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻ
RegulÀrer Ausdruck
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
top
Ein regulĂ€rer Ausdruck (englisch regular expression, AbkĂŒrzung RegExp oder Regex) ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Neben Implementierungen in vielen Programmiersprachen verarbeiten auch viele Texteditoren regulĂ€re AusdrĂŒcke in der Funktion âSuchen und Ersetzenâ. Ein einfacher Anwendungsfall von regulĂ€ren AusdrĂŒcken sind Wildcards.
RegulĂ€re AusdrĂŒcke können als Filterkriterien in der Textsuche verwendet werden, indem der Text mit dem Muster des regulĂ€ren Ausdrucks abgeglichen wird. Dieser Vorgang wird auch Pattern Matching genannt. So ist es beispielsweise möglich, alle Wörter aus einer Wortliste herauszusuchen, die mit S beginnen und auf D enden, ohne die dazwischen liegenden Buchstaben oder deren Anzahl explizit vorgeben zu mĂŒssen.
Der Begriff des regulĂ€ren Ausdrucks geht im Wesentlichen auf den Mathematiker Stephen Kleene zurĂŒck, der die Ă€hnliche Bezeichnung regulĂ€re Menge verwendete.cite-ref-kleene56-1-0[1]
Contents
âą Beispiele
âą Zeichenliterale
âą Quantoren
âą Alternativen
âą Weitere Zeichen
âą Inline modifiers
âą Beispiele
âą Literatur
âą Weblinks
âą Software
âą Einzelnachweise
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
RegulĂ€re AusdrĂŒcke in der theoretischen Informatik
Theoretische Grundlagen
RegulĂ€re AusdrĂŒcke sind spezielle Formeln, die regulĂ€re Sprachen beschreiben können.cite-ref-2[2] Diese regulĂ€ren Sprachen befinden sich auf der untersten Stufe der Chomsky-Hierarchie (Typ-3). Sie werden durch regulĂ€re Grammatiken erzeugt.
Zu jedem regulĂ€ren Ausdruck existiert ein endlicher Automat, der die vom Ausdruck spezifizierte Sprache akzeptiert. Ein entsprechender (nichtdeterministischer) endlicher Automat kann mit der Thompson-Konstruktioncite-ref-3[3] aus einem regulĂ€ren Ausdruck konstruiert werden. Daraus folgt die relativ einfache Implementierbarkeit regulĂ€rer AusdrĂŒcke. Umgekehrt existiert zu jedem endlichen Automaten ein regulĂ€rer Ausdruck, der die vom Automaten akzeptierte Sprache beschreibt. Ein entsprechender regulĂ€rer Ausdruck kann mit Kleenes Algorithmuscite-ref-kleene56-1-1[1]cite-ref-hopcroftullman94-4-0[4] aus einem nichtdeterministischen endlichen Automaten konstruiert werden. Kleenes Algorithmus erzeugt meist sehr lange regulĂ€re AusdrĂŒcke. Die Zustands-Eliminationcite-ref-hopcroftullman94-4-1[4] (deutsch eigentlich: âZustands-Eliminierungâ) liefert in der Praxis meist kĂŒrzere regulĂ€re AusdrĂŒcke. Im schlimmsten Fall (englisch âworst caseâ) liefern jedoch beide Algorithmen regulĂ€re AusdrĂŒcke der LĂ€nge | ÎŁ ÎŁ | 4 | Q | {\displaystyle |\Sigma |4^{|Q|}} ,cite-ref-5[5] wobei | ÎŁ ÎŁ | {\displaystyle |\Sigma |} die Anzahl der Zeichen des zugrundeliegenden Alphabets und | Q | {\displaystyle |Q|} die Anzahl der ZustĂ€nde im Automaten bezeichnen.
Syntax
Die Syntax definiert genau, wie regulĂ€re AusdrĂŒcke aussehen.
RegulĂ€re AusdrĂŒcke sind immer ĂŒber einer vorgegebenen endlichen Zeichenmenge ÎŁ ÎŁ {\displaystyle \Sigma } definiert, dem sogenannten Alphabet. RegulĂ€re AusdrĂŒcke basieren auf genau drei Operationen: Alternative, Verkettung und Wiederholung. Die formale Definition sieht folgendermaĂen aus:
1. â
â
{\displaystyle \varnothing } (das spezielle Symbol fĂŒr die leere Menge) ist ein regulĂ€rer Ausdruck.
2. fĂŒr alle a â â ÎŁ ÎŁ {\displaystyle a\in \Sigma } ist a {\displaystyle a} (die ReprĂ€sentation eines Zeichens aus dem zugrunde liegenden Alphabet) ein regulĂ€rer Ausdruck.
3. Sind x {\displaystyle x} und y {\displaystyle y} regulĂ€re AusdrĂŒcke, so sind auch ( x | y ) {\displaystyle (x|y)} (Alternative), ( x y ) {\displaystyle (xy)} (Verkettung) und ( x â â ) {\displaystyle (x^{*})} (Kleenesche HĂŒlle, Kleene-Stern) regulĂ€re AusdrĂŒcke.
FĂŒr Alternative wird statt | {\displaystyle |} auch das Symbol + {\displaystyle +} verwendet. Man schreibt dann ( x + y ) {\displaystyle (x+y)} . FĂŒr die Verkettung (Konkatenation) gibt es alternativ auch ein Operatorsymbol; man schreibt dann ( x â
â
y ) {\displaystyle (x\cdot y)} .
Man kann auch zusĂ€tzliche Konstanten und Operationen erlauben, sofern sich ihre Wirkung auch mit den oben genannten Grundregeln beschreiben lieĂe. So findet man in der Literatur unter anderem auch Ï” Ï” {\displaystyle \epsilon } als regulĂ€ren Ausdruckcite-ref-hopcroftullman94-4-2[4] oder die positive Kleenesche HĂŒlle x + {\displaystyle x^{+}} , die als AbkĂŒrzung von ( x ( x â â ) ) {\displaystyle (x(x^{*}))} betrachtet werden kann.
Gibt man eine Rangfolge der Operatoren an, kann man auf einige Klammern verzichten. Die Rangfolge ist ĂŒblicherweise Kleene-Stern vor Konkatenation vor Alternative. Statt ( ( ( a b ) | c ) â â ) {\displaystyle (((ab)|c)^{*})} genĂŒgt dann die Schreibweise ( a b | c ) â â {\displaystyle (ab|c)^{*}} .
Die Anzahl der verschachtelten *-Operatoren wird als Sternhöhe bezeichnet.
Semantik
Die Semantik regulĂ€rer AusdrĂŒcke definiert genau, welche formale Bedeutung die Syntax regulĂ€rer AusdrĂŒcke hat.
Ein regulÀrer Ausdruck beschreibt eine formale Sprache, also eine Menge von Wörtern (Zeichenketten). Die Definition der Semantik lÀsst sich analog zur Syntaxdefinition beschreiben. Dabei bezeichnet L ( r ) {\displaystyle {\mathcal {L}}(r)} die formale Sprache, die durch den regulÀren Ausdruck r {\displaystyle r} spezifiziert wird.
1. L ( â
â
) = â
â
{\displaystyle {\mathcal {L}}(\varnothing )=\emptyset } Das Symbol fĂŒr die leere Menge spezifiziert die leere Sprache.
2. fĂŒr alle a â â ÎŁ ÎŁ {\displaystyle a\in \Sigma } gilt L ( a ) = { a } {\displaystyle {\mathcal {L}}(a)=\{a\}} Jeder ReprĂ€sentant eines Zeichens aus dem Alphabet spezifiziert die Sprache, die nur das Wort der LĂ€nge eins mit diesem Zeichen enthĂ€lt.
3. sind x {\displaystyle x} und y {\displaystyle y} regulĂ€re AusdrĂŒcke, so gilt: Die Alternative zwischen zwei AusdrĂŒcken beschreibt die Sprache, die aus der Vereinigung der zwei Sprachen entsteht, die durch die beiden AusdrĂŒcke beschrieben werden. Die Konkatenation zweier AusdrĂŒcke beschreibt die Sprache, die nur die Wörter enthĂ€lt, die ein Wort aus der vom ersten Ausdruck beschriebenen Sprache als PrĂ€fix haben und deren unmittelbar folgendes Rest-Suffix ein Wort aus der vom zweiten Ausdruck beschriebenen Sprache ist. Die kleenesche HĂŒlle eines regulĂ€ren Ausdrucks x {\displaystyle x} beschreibt die Sprache mit jenen Wörtern, die durch Aneinanderreihen beliebiger Wörter der durch x {\displaystyle x} beschriebenen Sprache entstehen.
âą L ( x | y ) = L ( x ) âȘ âȘ L ( y ) {\displaystyle {\mathcal {L}}(x|y)={\mathcal {L}}(x)\cup {\mathcal {L}}(y)}
âą L ( x y ) = { α α ÎČ ÎČ | α α â â L ( x ) â§ â§ ÎČ ÎČ â â L ( y ) } {\displaystyle {\mathcal {L}}(xy)=\{\,\alpha \beta \,|\,\alpha \in {\mathcal {L}}(x)\land \beta \in {\mathcal {L}}(y)\,\}}
âą L ( x â â ) = { α α 1 ⊠⊠α α n | n â â N 0 , α α 1 , ⊠⊠, α α n â â L ( x ) } {\displaystyle {\mathcal {L}}(x^{*})=\{\,\alpha _{1}\dots \alpha _{n}\,|\,n\in \mathbb {N} _{0},\,\alpha _{1},\dots ,\alpha _{n}\in {\mathcal {L}}(x)\,\}}
EnthĂ€lt die Syntaxdefinition regulĂ€rer AusdrĂŒcke auch die Konstante Ï” Ï” {\displaystyle \epsilon } , so ist deren Bedeutung definiert als L ( Ï” Ï” ) = { Δ Δ } {\displaystyle {\mathcal {L}}(\epsilon )=\{\varepsilon \}} , also die Sprache, die nur das leere Wort Δ Δ {\displaystyle \varepsilon } enthĂ€lt.
Das leere Wort ist ein Wort einer formalen Sprache ( Δ Δ â â ÎŁ ÎŁ â â {\displaystyle \varepsilon \in \Sigma ^{*}} ) und somit kein regulĂ€rer Ausdruck. Die Sprache, die nur das leere Wort enthĂ€lt, lĂ€sst sich aber auch ohne die Konstante Ï” Ï” {\displaystyle \epsilon } durch einen regulĂ€ren Ausdruck beschreiben, zum Beispiel: â
â
â â {\displaystyle \varnothing ^{*}} . Es wird jedoch nicht immer optisch zwischen einem regulĂ€ren Ausdruck und der zugehörigen Sprache unterschieden, sodass man statt a {\displaystyle \mathbf {a} } auch a {\displaystyle a} als regulĂ€ren Ausdruck fĂŒr die Sprache { a } {\displaystyle \{a\}} verwendet, ebenso kann die Unterscheidung zwischen â
â
{\displaystyle \varnothing } und â
â
{\displaystyle \emptyset } sowie zwischen ϔ ϔ {\displaystyle \epsilon } und Δ Δ {\displaystyle \varepsilon } entfallen.
Beispiele
Wenn das Alphabet aus den Buchstaben a {\displaystyle a} , b {\displaystyle b} und c {\displaystyle c} besteht, also ÎŁ ÎŁ = { a , b , c } {\displaystyle \Sigma =\{a,b,c\}} , dann lassen sich die folgenden Sprachen mit den entsprechenden regulĂ€ren AusdrĂŒcken beschreiben:
âą Die Sprache aller Wörter, die aus beliebig vielen a {\displaystyle a} oder aus beliebig vielen b {\displaystyle b} bestehen: Syntax: r e g e x = a â â | b â â {\displaystyle \mathrm {regex} =\mathbf {a} ^{*}|\mathbf {b} ^{*}} . Semantik: L ( r e g e x ) = { a } â â âȘ âȘ { b } â â {\displaystyle {\mathcal {L}}(\mathrm {regex} )=\{a\}^{*}\cup \{b\}^{*}}
âą Die Sprache aller Wörter, die mit a {\displaystyle a} anfangen und mit beliebig vielen b {\displaystyle b} oder beliebig vielen c {\displaystyle c} enden: Syntax: r e g e x = a ( b â â | c â â ) {\displaystyle \mathrm {regex} =\mathbf {a} (\mathbf {b} ^{*}|\mathbf {c} ^{*})} . Semantik: L ( r e g e x ) = { a Ï Ï | Ï Ï â â { b } â â âȘ âȘ { c } â â } {\displaystyle {\mathcal {L}}(\mathrm {regex} )=\{a\varphi \;\vert \;\varphi \in \{b\}^{*}\cup \{c\}^{*}\}}
âą Die Sprache aller Wörter, die mit a {\displaystyle a} anfangen und mit einer beliebigen Folge aus den Zeichen a , b , c {\displaystyle a,b,c} enden: Syntax: r e g e x = a ( a | b | c ) â â {\displaystyle \mathrm {regex} =\mathbf {a} (\mathbf {a} |\mathbf {b} |\mathbf {c} )^{*}} . Semantik: L ( r e g e x ) = { a Ï Ï | Ï Ï â â ÎŁ ÎŁ â â } {\displaystyle {\mathcal {L}}(\mathrm {regex} )=\{a\varphi \;\vert \;\varphi \in \Sigma ^{*}\}}
âą Die Sprache aller Wörter, die zwei Zeichen lang sind und aus den Zeichen a {\displaystyle a} und b {\displaystyle b} bestehen: Syntax: r e g e x = ( a | b ) ( a | b ) {\displaystyle \mathrm {regex} =(\mathbf {a} |\mathbf {b} )(\mathbf {a} |\mathbf {b} )} . Semantik: L ( r e g e x ) = { Ï Ï Ï Ï | Ï Ï , Ï Ï â â { a , b } } = { a a , a b , b a , b b } {\displaystyle {\mathcal {L}}(\mathrm {regex} )=\{\psi \varphi \;\vert \;\psi ,\varphi \in \{a,b\}\}=\{aa,ab,ba,bb\}}
âą Die Sprache aller Wörter, die aus beliebig vielen Teilwörtern a b {\displaystyle ab} bestehen: Syntax: r e g e x = ( a b ) â â {\displaystyle \mathrm {regex} =(\mathbf {a} \mathbf {b} )^{*}} . Semantik: L ( r e g e x ) = { a b } â â = { Ï” Ï” , a b , a b a b , a b a b a b , ⯠⯠} {\displaystyle {\mathcal {L}}(\mathrm {regex} )=\{ab\}^{*}=\{\epsilon ,ab,abab,ababab,\cdots \}}
Anwendung regulĂ€rer AusdrĂŒcke
Ken Thompson nutzte diese Notation in den 1960er Jahren, um qed (eine VorgĂ€ngerversion des Unix-Editors ed) zu bauen und spĂ€ter das Werkzeug grep zu schreiben. Seither implementieren sehr viele Programme und Bibliotheken von Programmiersprachen Funktionen, um regulĂ€re AusdrĂŒcke zum Suchen und Ersetzen von Zeichenketten zu nutzen. Beispiele dafĂŒr sind die Programme sed, awk, grep, lex, emacs, die Programmiersprachen Perl und Tcl und Standardbibliotheken der Programmiersprachen C, C++, Java, JavaScript, Python, PHP, R, Ruby und das .Net-Framework. Auch die Textverarbeitung und die Tabellenkalkulation des Office-Paketes OpenOffice.org bieten die Möglichkeit, mit regulĂ€ren AusdrĂŒcken im Text zu suchen.
Zwischen verschiedenen Regexp-Implementierungen gibt es Unterschiede in Funktionsumfang und Syntax. In Programmiersprachen haben sich ĂŒberwiegend die Perl Compatible Regular Expressions (PCRE) durchgesetzt, die sich an der Umsetzung in Perl 5.0 orientieren. Daneben wird bei POSIX zwischen âgrundlegendenâ regulĂ€ren AusdrĂŒcken (basic regular expressions) und âerweitertenâ regulĂ€ren AusdrĂŒcken (extended regular expressions) unterschieden.
Einige Programme, zum Beispiel der Texteditor Vim, bieten die Möglichkeit, zwischen verschiedenen Regexp-Syntaxen hin- und herzuschalten.
RegulĂ€re AusdrĂŒcke spielen eine wichtige Rolle bei der lexikalischen Analyse von Quelltexten, beispielsweise in Compilern oder zur Syntaxhervorhebung in Editoren. Ein lexikalischer Scanner zerlegt den Quelltext mithilfe von regulĂ€ren AusdrĂŒcken in sogenannte Tokens (SchlĂŒsselwörter, Operatoren, âŠ). Da es sich bei den meisten Programmiersprachen um kontextfreie Sprachen handelt, sind regulĂ€re AusdrĂŒcke nicht mĂ€chtig genug, um deren Syntax zu beschreiben. Daher wird die bei Compilern folgende syntaktische Analyse in der Regel von einem separaten Programm, dem Parser, erledigt.
RegulĂ€re AusdrĂŒcke spielen auch in der Bioinformatik eine Rolle. Sie kommen in Proteindatenbanken zum Einsatz, um Proteinmotive zu beschreiben. Der regulĂ€re Ausdruck
W-x{9,11}-[VFY]-[FYW]-x{6,7}-[GSTNE]-[GSTQCR]-[FYW]-R-S-A-P
beschreibt zum Beispiel eine ProteindomÀne in PROSITE. Der obige regulÀre Ausdruck besagt Folgendes: Am Anfang wÀhle die AminosÀure Tryptophan (Einbuchstabencode W), dann wÀhle 9 bis 11 AminosÀuren frei aus, dann wÀhle entweder V, F oder Y, dann wÀhle entweder F, Y oder W, dann wieder 6 bis 7 AminosÀuren frei, dann entweder G, S, T, N oder E, dann entweder G, S, T, Q, C oder R, dann F, Y oder W, dann R dann S dann A dann P.
RegulĂ€re AusdrĂŒcke in der Praxis
Die meisten heutigen Implementierungen unterstĂŒtzen Erweiterungen wie zum Beispiel RĂŒckwĂ€rtsreferenzen (backreferences). Hierbei handelt es sich nicht mehr um regulĂ€re AusdrĂŒcke im Sinne der theoretischen Informatik, denn die so erweiterten AusdrĂŒcke beschreiben nicht mehr notwendigerweise Sprachen vom Typ 3 der Chomsky-Hierarchie.
Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gÀngigen Implementierungen mit Erweiterungen, sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.
Eine hĂ€ufige Anwendung regulĂ€rer AusdrĂŒcke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten zu finden. Die im Folgenden angegebene Beschreibung ist eine (oft benutzte) Konvention, um Konzepte wie Zeichenklasse, Quantifizierung, VerknĂŒpfung und Zusammenfassen konkret zu realisieren. Hierbei wird ein regulĂ€rer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit den Metazeichen [ ] ( ) { } | ? + - * ^ $ \ . (teilweise kontextabhĂ€ngig) gebildet, bei manchen Implementierungen auch : ! < =. Die Meta-Eigenschaft eines Zeichens kann durch einen vorangestellten RĂŒckwĂ€rtsstrich (Backslash) aufgehoben werden. Alle ĂŒbrigen Zeichen des Alphabets stehen fĂŒr sich selbst.
Zeichenliterale
Diejenigen Zeichen, die direkt (wörtlich, literal) ĂŒbereinstimmen mĂŒssen, werden auch direkt notiert. Je nach System gibt es auch Möglichkeiten, das Zeichen durch den Oktal- oder Hexadezimalcode (\ooo bzw. \xhh) oder die hexadezimale Unicode-Position (\uhhhh) anzugeben.
Ein Zeichen aus einer Auswahl
Mit eckigen Klammern ([ und ]) lĂ€sst sich eine Zeichenauswahl definieren. Der Ausdruck in eckigen Klammern steht dann fĂŒr genau ein Zeichen aus dieser Auswahl. Innerhalb dieser Zeichenklassendefinitionen haben einige Symbole andere Bedeutungen als im normalen Kontext. Teilweise ist die Bedeutung eines Symbols vom Kontext abhĂ€ngig, in dem es innerhalb der Klammern auftritt.
Beispielsweise bedeutet ein Zirkumflex ^ am Anfang einer Zeichenklassendefinition, dass die Zeichenklasse negiert bzw. invertiert wird (im Sinne der Komplementbildung). Steht ein Zirkumflex jedoch irgendwo sonst in der Definition, ist es wörtlich (âliterallyâ) zu verstehen. Ebenfalls kontextabhĂ€ngig ist die Bedeutung des Bindestrich-Zeichens (-). Zudem unterscheiden sich hier die Regexp-Auswerter (âregex enginesâ) (zum Beispiel POSIX und PCRE) in einigen Punkten voneinander. Steht ein Bindestrich - zwischen zwei Zeichen in der Klassendefinition, zum Beispiel [a-g], so ist er als Bis-Strich zu verstehen, das heiĂt als Beschreibung eines Zeichenintervalls oder Zeichenbereichs bezĂŒglich der ASCII-Tabelle. Das genannte Beispiel wĂ€re Ă€quivalent zu [abcdefg]. Am Anfang oder Ende einer Zeichenklasse stehende Bindestriche werden als das Zeichen selbst interpretiert.
| [egh] | eines der Zeichen e , g oder h |
|---|---|
| [0-6] | eine Ziffer von 0 bis 6 (Bindestriche sind Indikator fĂŒr einen Bereich) |
| [A-Za-z0-9] | ein beliebiger lateinischer Buchstabe oder eine beliebige Ziffer |
| [^a] | ein beliebiges Zeichen auĂer a ( ^ am Anfang einer Zeichenklasse negiert selbige) |
| [-A-Z] , [A-Z-] (bzw. [A-Z\-a-z] , allerdings nicht gemÀà POSIX) [ 6 ] | Auswahl enthÀlt auch den Bindestrich - , wenn er das erste oder das letzte Zeichen in der AufzÀhlung einer Zeichenklasse ist bzw. bei PCRE, wenn seine Metafunktion innerhalb einer Auswahl durch einen vorangestellten Backslash aufgehoben wird |
Vordefinierte Zeichenklassen
Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementierungen in gleicher Weise unterstĂŒtzt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können. Wichtige Zeichenklassen sind:
| \d | d igit | eine Ziffer, also [0-9] (und evtl. auch weitere Zahlzeichen in Unicode , z. B. bengalische Ziffern ) |
|---|---|---|
| \D | no d igit | ein Zeichen, das keine Ziffer ist, also [^\d] |
| \w | w ord character | ein Buchstabe, eine Ziffer oder der Unterstrich, also [a-zA-Z_0-9] (und evtl. auch nicht-lateinische Buchstaben, z. B. Umlaute) |
| \W | no w ord character | ein Zeichen, das weder Buchstabe noch Zahl noch Unterstrich ist, also [^\w] |
| \s | white s pace | meist zumindest das Leerzeichen und die Klasse der Steuerzeichen \f , \n , \r , \t und \v |
| \S | no white s pace | ein Zeichen, das kein Whitespace ist, also [^\s] |
Ein Punkt (.) bedeutet, dass an seinem Platz ein (fast) beliebiges Zeichen stehen kann. Die meisten RegExp-Implementierungen sehen standardmĂ€Ăig ZeilenumbrĂŒche nicht als beliebiges Zeichen an, jedoch kann dieses in einigen Programmen mittels des sogenannten Single-Line-Modifiers s (zum Beispiel in /foo.bar/s) erreicht werden.
In vielen neueren Implementierungen können innerhalb der eckigen Klammern nach POSIX auch Klassen angegeben werden, die selbst wiederum eckige Klammern enthalten. Sie lauten beispielsweise:
| [:cntrl:] â Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F und 7F (DEL). [:print:] â Druckbare Zeichen: [:alnum:] , [:punct:] und Leerzeichen [:space:] â Whitespace : Horizontales und vertikales Tabulatorzeichen, Zeilen- und Seitenvorschub , WagenrĂŒcklauf und Leerzeichen ZK1 [:blank:] â Leerzeichen oder Tabulatorzeichen [:graph:] â Graphische Zeichen: [:alnum:] oder [:punct:] [:punct:] â Satzzeichen, unter anderem Interpunktionszeichen , AnfĂŒhrungszeichen oder Unterstriche. [:alnum:] â Alphanumerische Zeichen : [:alpha:] oder [:digit:] [:xdigit:] â Hexadezimale Ziffern: 0 bis 9 , A bis F , a bis f . [:digit:] â Die Ziffern 0 bis 9 [:alpha:] â Buchstaben: [:lower:] oder [:upper:] [:lower:] â Kleinbuchstaben ZK2 : nicht notwendigerweise nur von a bis z [:upper:] â GroĂbuchstaben ZK2 : nicht notwendigerweise nur von A bis Z |
|---|
| Anmerkungen: ZK1 Das auch als â geschĂŒtztes Leerzeichen â bekannte Zeichen mit der Unicode-Nummer 160 (hex: A0) (entspricht dem HTML-Entity ) wird von der Klasse [:space:] möglicherweise nicht gefunden und muss separat anhand des Codepoints identifiziert werden. ZK2 Was Buchstaben sind, ist in ĂŒblichen Betriebssystemen locale -abhĂ€ngig, also abhĂ€ngig von der eingestellten Region und Sprache. [ 7 ] |
Quantoren
Quantoren (englisch quantifier, auch Quantifizierer oder Wiederholungsfaktoren) erlauben es, den vorherigen Ausdruck in verschiedener Vielfachheit in der Zeichenkette zuzulassen.
| { min , max } | Der voranstehende Ausdruck muss mindestens min -mal und darf maximal max -mal vorkommen. |
|---|---|
| { n } | Der voranstehende Ausdruck muss exakt n -mal vorkommen. Dies entspricht { n , n } . |
| {0, max } | Der voranstehende Ausdruck darf maximal max -mal vorkommen. |
| { min ,} | Der voranstehende Ausdruck muss mindestens min -mal vorkommen. |
| ? | Der voranstehende Ausdruck kommt kein- oder einmal vor, er ist âoptionalâ. Dies entspricht {0,1} . |
| + | Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen. Dies entspricht {1,} . |
| * | Der voranstehende Ausdruck darf beliebig oft, auch keinmal, vorkommen. Dies entspricht {0,} . |
Die Quantoren beziehen sich dabei auf den vorhergehenden regulĂ€ren Ausdruck, jedoch nicht zwangslĂ€ufig auf die durch ihn gefundene Ăbereinstimmung. So wird zwar zum Beispiel durch a+ ein âaâ oder auch âaaaaâ vertreten, jedoch entspricht [0-9]+ nicht nur sich wiederholenden gleichen Ziffern, sondern auch Folgen gemischter Ziffern, beispielsweise â072345â.
Weitere Beispiele sind:
âą [ab]+ entspricht âaâ, âbâ, âaaâ, âbbaabâ etc.
âą [0-9]{2,5} entspricht zwei, drei, vier oder fĂŒnf Ziffern in Folge, z. B. â42â oder â54072â, jedoch nicht den Zeichenfolgen â0â, â1.1â oder âa1a1â.
Soll eine Zeichenkette nur aus dem gesuchten Muster bestehen (und es nicht nur enthalten), so muss in den meisten Implementierungen explizit definiert werden, dass das Muster vom Anfang (\A oder ^) QF1 bis zum Ende der Zeichenkette (\Z, \z oder $) QF1 reichen soll. Andernfalls erkennt zum Beispiel [0-9]{2,5} auch bei der Zeichenkette â1234507â die Teilzeichenkette â12345â. Aus dem gleichen Grund ergĂ€be beispielsweise a* immer einen Treffer, da jede Zeichenfolge insbesondere das leere Wort mindestens 0-mal das Zeichen âaâ enthĂ€lt.
Quantoren sind standardmĂ€Ăig âgierigâ (englisch greedy) implementiert. Das heiĂt, ein regulĂ€rer Ausdruck wird zur gröĂtmöglichen Ăbereinstimmung aufgelöst. Da dieses Verhalten jedoch nicht immer so gewollt ist, lassen sich bei vielen neueren Implementierungen Quantoren als âgenĂŒgsamâ oder âzurĂŒckhaltendâ (englisch non-greedy, reluctant) deklarieren. Zum Beispiel wird in Perl oder tcl hierfĂŒr dem Quantor ein Fragezeichen ? nachgestellt. Die Implementierung von genĂŒgsamen Quantoren ist vergleichsweise aufwendig und wĂ€hrend des Suchvorgangs langsam (erfordert Backtracking), weshalb manche Implementierungen diese ausdrĂŒcklich vermeiden z. B. sed.
Beispiel (Perl-Syntax)
Angenommen, es wird der regulĂ€re Ausdruck A.*B auf die Zeichenfolge âABCDEBâ angewendet, so wĂŒrde er sie als âABCDEBâ finden. Mit Hilfe des âgenĂŒgsamenâ Quantors *? passt der nun modifizierte Ausdruck â also A.*?B â nur die Zeichenkette âABâ, bricht also die Suche nach dem ersten gefundenen âBâ ab. Ein gleichwertiger regulĂ€rer Ausdruck fĂŒr Interpreter, die diesen Quantor nicht unterstĂŒtzen, wĂ€re A[^B]*B.
Die Zeichen
^
und
$
passen im
multiline-
Modus zusammen, also wenn der m-Modifier gesetzt wird, auch ZeilenanfÀnge und -enden.
Possessives Verhalten
Eine Variante des oben beschriebenen gierigen Verhaltens ist das possessive matching. Da hierbei jedoch das Backtracking verhindert wird, werden einmal ĂŒbereinstimmende Zeichen nicht wieder freigegeben. Daher finden sich in der Literatur auch die synonymen Bezeichnungen atomic grouping, independent subexpression oder non-backtracking subpattern. Die Syntax fĂŒr diese Konstrukte variiert bei den verschiedenen Programmiersprachen. UrsprĂŒnglich wurden solche TeilausdrĂŒcke (englisch âsubpatternâ) in Perl durch (?>Ausdruck) formuliert. Daneben existieren seit Perl 5.10 die Ă€quivalenten, in Java bereits ĂŒblichen possessiven Quantoren ++, *+, ?+ und {min,max}+.
Beispiel
Angenommen es wird auf die Zeichenfolge âABCDEBâ der regulĂ€re Ausdruck A.*+B angewendet, so fĂ€nde er keine Ăbereinstimmung. Bei der Abarbeitung des regulĂ€ren Ausdrucks wĂŒrde der Teil .*+ bis zum Ende der Zeichenkette ĂŒbereinstimmen. Um jedoch den gesamten Ausdruck zu finden, mĂŒsste ein Zeichen â hier also das âBâ â wieder freigegeben werden. Der possessive Quantor verbietet dies aufgrund des unterdrĂŒckten Backtrackings, weshalb keine erfolgreiche Ăbereinstimmung gefunden werden kann.
Gruppierungen und RĂŒckwĂ€rtsreferenzen
AusdrĂŒcke lassen sich mit runden Klammern ( und ) zusammenfassen: Etwa erlaubt (abc)+ ein âabcâ oder ein âabcabcâ etc. Wörtlich gemeinte Klammern kann man mit \( und \) benennen. Bei manchen Implementationen ist es umgekehrt; in jedem Fall sind aber runde Klammern innerhalb von Zeichenklassen immer wörtlich.
Einige Implementierungen speichern die gefundenen Ăbereinstimmungen von Gruppierungen ab und ermöglichen deren Wiederverwendung im regulĂ€ren Ausdruck oder bei der Textersetzung. Diese werden RĂŒckwĂ€rtsreferenzen (englisch back references) genannt. HĂ€ufig wird dazu die Schreibweise \n oder $n verwendet, wobei n die Ăbereinstimmung der n-ten Gruppierung entspricht. Eine Sonderstellung stellt dabei n=0 dar, das meist fĂŒr die Ăbereinstimmung des gesamten regulĂ€ren Ausdrucks steht.
Beispiel
Ein Suchen und Ersetzen mit AA(.*?)BB als regulĂ€rem Suchausdruck und \1 als Ersetzung ersetzt alle Zeichenketten, die von AA und BB eingeschlossen sind, durch den zwischen AA und BB enthaltenen Text. Das heiĂt AA und BB und der Text dazwischen werden ersetzt durch den Text, der ursprĂŒnglich zwischen AA und BB stand, also fehlen AA und BB im Ergebnis.
Interpreter von regulĂ€ren AusdrĂŒcken, die RĂŒckwĂ€rtsreferenzen im Suchmuster zulassen, entsprechen nicht mehr dem Typ 3 der Chomsky-Hierarchie. Mit dem Pumping-Lemma lĂ€sst sich zeigen, dass ein regulĂ€rer Ausdruck, der feststellt, ob in einer Zeichenkette vor und nach der 1 die gleiche Anzahl von 0 steht, keine regulĂ€re Sprache ist.
Daneben gibt es auch noch Gruppierungen, die keine RĂŒckwĂ€rtsreferenz erzeugen (englisch non-capturing). Die Syntax dafĂŒr lautet in den meisten Implementierungen (?:âŠ). Regexp-Dokumentationen weisen darauf hin, dass die Erzeugung von RĂŒckwĂ€rtsreferenzen stets vermieden werden soll, wenn kein spĂ€terer Zugriff auf sie erfolge. Denn die Erzeugung der Referenzen kostet AusfĂŒhrungszeit und belegt Platz zur Speicherung der gefundenen Ăbereinstimmung. Zudem lassen die Implementationen nur eine begrenzte Anzahl an RĂŒckwĂ€rtsreferenzen zu (hĂ€ufig nur maximal 9).
Beispiel
Mit dem regulĂ€ren Ausdruck \d+(?:-\d+)* können Folgen von durch Bindestriche getrennten Zahlenfolgen gefunden werden, ohne dabei die letzte durch einen Bindestrich getrennte Zahlenfolge als RĂŒckreferenz zu erhalten.
Beispiel
Ein Datum im Format MM/DD/YYYY soll in das Format YYYY-MM-DD ĂŒberfĂŒhrt werden.
1. Mit Hilfe des Ausdrucks ([0-1]?[0-9])\/([0-3]?[0-9])\/([0-9]{4}) werden die drei Zahlengruppen extrahiert.
2. Mit dem Ersetzungs-Ausdruck \3-\1-\2 werden die einzelnen Gruppen in das richtige Format ĂŒberfĂŒhrt.
Alternativen
Man kann alternative AusdrĂŒcke mit dem |-Symbol zulassen.
Beispiel
ABC|abc bedeutet âABCâ oder âabcâ, aber z. B. nicht âAbcâ.
Weitere Zeichen
Um die oft auf Zeichenketten bezogenen Anwendungen auf dem Computer zu unterstĂŒtzen, werden in der Regel zusĂ€tzlich zu den bereits genannten die folgenden Zeichen definiert:
| ^ | steht fĂŒr den Zeilenanfang (nicht zu verwechseln mit ^ bei der Zeichenauswahl mittels [ und ] ). |
|---|---|
| $ | kann je nach Kontext fĂŒr das Zeilen- oder Zeichenketten-Ende stehen, wobei bei manchen Implementierungen noch ein â\nâ folgen darf. Das tatsĂ€chliche Ende passt zu \z . |
| \ | hebt gegebenenfalls die Metabedeutung des nĂ€chsten Zeichens auf (siehe Maskierungszeichen ). Beispielsweise lĂ€sst der Ausdruck (A\*)+ die Zeichenketten âA*â, âA*A*â usw. zu. Auf diese Weise lĂ€sst sich auch ein Punkt â.â mit \. suchen, wĂ€hrend nach \ mit \\ gesucht wird. |
| \b | leere Zeichenkette am Wortanfang oder am Wortende |
| \B | leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet |
| \< | leere Zeichenkette am Wortanfang |
| \> | leere Zeichenkette am Wortende |
| \n | ein Zeilenumbruch im Unix-Format |
| \r | ein Zeilenumbruch im (alten, d. h. vor dem Jahr 1999) Mac-Format |
| \r\n | ein Zeilenumbruch im DOS- und Windows-Format |
| \t | ein Horizontal- Tabulatorzeichen |
Beispiel
[^ ]$ bedeutet: Die Zeichenkette muss aus mindestens einem Zeichen bestehen, und das letzte Zeichen darf kein Leerzeichen sein.
Look-around assertions
Perl Version 5 fĂŒhrte zusĂ€tzlich zu den ĂŒblichen regulĂ€ren AusdrĂŒcken auch look-ahead und look-behind assertions (etwa âvorausschauendeâ bzw. ânach hinten schauendeâ Annahmen oder Behauptungen) ein, was unter dem Begriff look-around assertions zusammengefasst wird.cite-ref-8[8] Diese Konstrukte erweitern die regulĂ€ren AusdrĂŒcke um die Möglichkeit, kontextabhĂ€ngige (englisch: âcontext sensitiveâ) Bedingungen zu formulieren, ohne den Kontext selbst als passend zu finden. Das heiĂt, möchte man alle Zeichenfolgen âSportâ finden, denen die Zeichenfolge âvereinâ folgt, ohne dass jedoch die gefundene Zeichenfolge die Zeichenfolge âvereinâ selbst enthĂ€lt, wĂ€re dies mit einer look-ahead assertion möglich: Sport(?=verein). Im Beispielsatz âEin Sportler betreibt Sport im Sportverein.â wĂŒrde jener regulĂ€re Ausdruck also zum letzten Vorkommen von âSportâ passen, da nur diesem die Zeichenfolge âvereinâ folgt; er wĂŒrde jedoch nicht zur Teilzeichenkette âSportvereinâ passen.
Aufgrund der Eigenschaft, dass der angegebene Kontext (im Beispiel âvereinâ) zwar angegeben wird, jedoch kein expliziter Bestandteil der passenden Zeichenkette (hier âSportâ) ist, wird im Zusammenhang mit assertions meist das Attribut zero-width mitgenannt. Die vollstĂ€ndigen Bezeichnungen lauten somit â je nachdem, ob ein bestimmter Kontext gefordert (positiv) oder verboten (negativ) ist â zero-width positive/negative look-ahead/behind assertions. Die Bezeichnungen der Richtungen rĂŒhren daher, dass Regexp-Parser eine Zeichenkette immer von links nach rechts abarbeiten.
| Definition | Bezeichnung | ErklÀrung | Schreibweise |
|---|---|---|---|
| (?= Ausdruck ) | positive look-ahead assertion | Ausdruck muss auf vorgenannten Ausdruck folgen | Ausdruck (?= Ausdruck ) |
| (?! Ausdruck ) | negative look-ahead assertion | Ausdruck darf nicht auf vorgenannten Ausdruck folgen | Ausdruck (?! Ausdruck ) |
| (?<= Ausdruck ) | positive look-behind assertion | Ausdruck muss nachfolgendem Ausdruck vorausgehen | (?<= Ausdruck ) Ausdruck |
| (?<! Ausdruck ) | negative look-behind assertion | Ausdruck darf nachfolgendem Ausdruck nicht vorausgehen | (?<! Ausdruck ) Ausdruck |
Beispiel
\s(?=EUR) steht fĂŒr ein âWhitespaceâ-Zeichen (d. h. Leerzeichen oder Tabulator), dem die Zeichenkette EUR folgt. Im Gegensatz zu \sEUR gehört hier EUR nicht zu einer passenden Zeichenkette (englisch: âmatched character stringâ).
Inline modifiers
Einige Implementierungen (unter anderem PHP, Perl/PCRE, Python sowie die PowerShell-Operatoren -match und -replace) unterstĂŒtzen eingebettete Modifikatoren:
| (? Modifikatoren ) Ausdruck | Modifikatoren mit unbeschrÀnktem Geltungsbereich. |
|---|---|
| (? Modifikatoren : Ausdruck ) | Modifikatoren mit auf den Ausdruck eingeschrÀnktem Geltungsbereich. |
Es können mehrere Modifikatoren hintereinander geschrieben werden, wobei voranstehende Minuszeichen (-) deren Wirkungen negieren. Verbreitete Modifikatoren sind:
| i | fĂŒr Case-Insensitive , d. h. zwischen GroĂ- und Kleinschreibung wird nicht unterschieden. |
|---|---|
| m | aktiviert multiline-Modus , d. h. ^ und $ treffen nicht nur auf den Anfang bzw. das Ende der Eingabe zu, sondern auch auf darin enthaltene ZeilenumbrĂŒche. |
| s | aktiviert singleline-Modus , d. h. ein Punkt ( . ) fĂŒhrt auch fĂŒr ZeilenumbrĂŒche zu einem Treffer. |
Beispiele:
âą (?i)i als auch (?i:i) finden jeweils in Iris zwei Treffer.
âą (?-i)i als auch (?-i:i) finden jeweils in Iris nur einen Treffer.
Bedingte AusdrĂŒcke
Relativ wenig verbreitet sind bedingte AusdrĂŒcke. Diese sind unter anderem in Perl, PCRE und dem .Net-Framework einsetzbar. Python bietet fĂŒr solche AusdrĂŒcke im Zusammenhang mit Look-around assertions nur eingeschrĂ€nkte FunktionalitĂ€t.cite-ref-10[10]
Ist der falsch-Ausdruck leer, so kann der senkrechte Strich (|) entfallen. Als Bedingung kann u. a. eine Look-around assertion oder die Nummer einer Gruppierung angegeben werden, die zutreffen muss, damit der wahr-Ausdruck Anwendung findet.
Beispiele
Ob die linke oder rechte Seite einer Alternative angewandt werden soll, lĂ€sst sich an eine Bedingung knĂŒpfen: Auf die Zeichenkette abc treffen sowohl die regulĂ€ren AusdrĂŒcke (.b|a)c als auch (?(?=a).b|a)c zu; ebenso trifft darauf (a|.b)c zu, jedoch nicht (?(?=a)a|.b)c.
Mit den AusdrĂŒcken (\()?\d+(?(1)\)) und (?(?=\()\(\d+\)|\d+) werden jeweils Zeichenfolgen wie 1, (2), 34 oder (567) getroffen, aber nicht (42 oder 3). Es soll nicht unerwĂ€hnt bleiben, dass sich im vorliegenden Fall mittels der einfachen Alternative \(\d+\)|\d+ das gleiche Ergebnis erzielen lĂ€sst.
Beispiele
Die folgende Tabelle zeigt einige regulĂ€re AusdrĂŒcke und jeweils dazu passende Zeichenketten:cite-ref-11[11]
| RegulÀrer Ausdruck | Passende Zeichenketten |
|---|---|
| hello | hello |
| gray/grey | gray , grey |
| gr(a/e)y | gray , grey |
| gr[ae]y | gray , grey |
| b[aeiou]bble | babble , bebble , bibble , bobble , bubble |
| [b-chm-pP]at/ot | bat , cat , hat , mat , nat , oat , pat , Pat , ot |
| colou?r | color , colour |
| rege(x(es)?/xps?) | regex , regexes , regexp , regexps |
| go*gle | ggle , gogle , google , gooogle , ... |
| go+gle | gogle , google , gooogle , ... |
| g(oog)+le | google , googoogle , googoogoogle , ... |
| z{3} | zzz |
| z{3,6} | zzz , zzzz , zzzzz , zzzzzz |
| z{3,} | zzz , zzzz , zzzzz , ... |
| Hello\nworld | Hello world |
Literatur
RegulĂ€re AusdrĂŒcke
âą Jeffrey Friedl: RegulĂ€re AusdrĂŒcke. OâReilly, ISBN 3-89721-720-1. online
âą Tony Stubblebine: RegulĂ€re AusdrĂŒcke â kurz und gut. OâReilly, ISBN 3-89721-264-1.
âą Mehran Habibi: Real World Regular Expressions with Java 1.4. Springer, ISBN 1-59059-107-0.
âą Jan Goyvaerts, Steven Leviathan: RegulĂ€re AusdrĂŒcke Kochbuch. OâReilly, ISBN 978-3-89721-957-1.
âą Michael Fitzgerald: Introducing Regular Expressions OâReilly, ISBN 978-1-4493-9268-0.
RegulĂ€re AusdrĂŒcke und natĂŒrliche Sprachen
âą Kenneth R. Beesley, Lauri Karttunen: Finite-State Morphology. Distributed for the Center for the Study of Language and Information. 2003. 2003 Series: (CSLI-SCL) Studies in Computational Linguistics.
RegulĂ€re AusdrĂŒcke und Automatentheorie
âą Jan Lunze: Ereignisdiskrete Systeme. Oldenbourg, 2006, ISBN 3-486-58071-X, S. 160â192.
Forschungsliteratur
âą Stephen C. Kleene: Representation of Events in Nerve Nets and Finite Automata. In: Claude E. Shannon, John McCarthy (Hrsg.): Automata Studies. Princeton University Press, 1956, S. 3â42.
Weblinks
âą POSIX Basic Regular Expressions bei Wikibooks (englisch)
âą POSIX Extended Regular Expressions bei Wikibooks (englisch)
âą Perl-Compatible Regular Expressions bei Wikibooks (englisch)
âą RegulĂ€re Sprachen, regulĂ€re AusdrĂŒcke
âą RegulĂ€re AusdrĂŒcke ausprobieren
âą POSIX-Spezifikation fĂŒr regulĂ€re AusdrĂŒcke (englisch)
âą Perl-Syntax regulĂ€rer AusdrĂŒcke (englisch)
âą Regex-Kurs fĂŒr AnfĂ€nger mit Ăbungen
âą Umfangreiche Anleitung zu regulĂ€ren AusdrĂŒcken und verschiedenen Implementierungen (englisch)
Software
âą Online visual regex tester
âą Online regex tester
âą Online regex tester â Visualisierung und schrittweise Nachverfolgung der Funktionsweise von regulĂ€ren AusdrĂŒcken (englisch)
Einzelnachweise
cite-note-kleene56-11. â Stephen C. Kleene: Representation of Events in Nerve Nets and Finite Automata. In: Claude E. Shannon, John McCarthy (Hrsg.): Automata Studies. Princeton University Press, 1956, S. 3â42.
cite-note-22. â Uwe Schöning: Theoretische Informatik - kurz gefasst. 5. Auflage. Spektrum Akademischer Verlag, Heidelberg 2009, ISBN 978-3-8274-1824-1, S. 28.
cite-note-33. â Alfred V. Aho, Ravi Sethi, Jeffrey Ullman: Compilers: Principles, Techniques and Tools. Addison-Wesley, 1986
cite-note-hopcroftullman94-44. â John E. Hopcroft, Jeffry D. Ullman: EinfĂŒhrung in die Automatentheorie, formale Sprachen und KomplexitĂ€tstheorie. Addison-Wesley, Bonn 1994, ISBN 3-89319-744-3.
cite-note-61. POSIX-Spezifikationen
cite-note-72. RE Bracket Expression, IEEE Std 1003.1, The Open Group Base Specifications, 2004
cite-note-88. â Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions. Abgerufen am 22. Juni 2024.
cite-note-99. â New in JavaScript 1.5 - JavaScript | MDN. 29. August 2014, abgerufen am 22. Juni 2024.
cite-note-1010. â Regex Tutorial - If-Then-Else Conditionals. Abgerufen am 22. Juni 2024.
cite-note-1111. â regex. Abgerufen am 22. Juni 2024.